package com.yang.config;

import com.yang.filter.TokenFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

/**
 * 配置Spring Security的类
 * 用于定义Web安全相关的配置，比如URL权限、登录配置、注销配置等
 * 借助AI生成
 */
@Configuration
@EnableWebSecurity
//@Profile("local") // 实用与本地生成环境，放行所有接口（测试阶段使用）
public class SecurityConfig {

    @Autowired
    private TokenFilter tokenFilter;

    /**
     * 配置SecurityFilterChain bean的方法
     * 该方法用于配置HTTP请求的安全约束，登录和注销的规则
     */
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // 1. 关闭 CSRF（API 场景常用，若需保留可删除）
                .csrf(AbstractHttpConfigurer::disable)

                // 2. 会话管理：无状态（JWT 等 Token 认证场景常用）
                .sessionManagement(session ->
                        session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                )

                // 3. 授权规则：替换 authorizeRequests() 为 authorizeHttpRequests()
                .authorizeHttpRequests(auth -> {
                    // ========== 测试接口白名单 ==========
                    // 替换为实际的测试接口路径，如 /test/**、/api/test/** 等
                    auth.requestMatchers("/test/**").permitAll();

                    // （可选）放行 Swagger 文档（若项目集成了 Swagger）
                    auth.requestMatchers(
                                    "/swagger-ui/**",
                                    "/v3/api-docs/**",
                                    "/doc.html") // 若用 knife4j
                            .permitAll();

                    // 放行登录/注册等公开接口
                    auth.requestMatchers("/user/login", "/user/register").permitAll();

                    // ========== 其他规则 ==========
                    // 剩余请求需认证（生产环境必选，测试环境也可按需开启）
                    auth.anyRequest().authenticated();
                });


        http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);

        // 构建并返回SecurityFilterChain实例
        return http.build();
    }
}
